﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;

namespace GZ.Common
{
    /// <summary>
    /// 实体转换辅助类
    /// </summary>
    public class ModelConvertHelper<T>
    {
        public static IList<T> ConvertToModel(DataTable dt)
        {
            //判断当前DataTable是否为空
            if (dt == null)
            {
                return null;
            }
            if (dt.Rows.Count < 0)
            {
                return null;
            }

            //创建一个泛型集合对象
            IList<T> list = new List<T>();
            //循环遍历DataTable的每一行
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                //创建一个泛型对象
                T t = Activator.CreateInstance<T>();
                //获取类的所有属性
                PropertyInfo[] propertyInfo = t.GetType().GetProperties();
                //循环遍历这个类的属性
                foreach (PropertyInfo item in propertyInfo)
                {
                    //内层循环遍历DataTable的每一列
                    for (int j = 0; j < dt.Columns.Count; j++)
                    {
                        #region
                        //为了避免实体类定义的属性名称的大小写和数据库里的字段名称大小写不一致，可统一转换为一种格式，在进行匹配
                        if (item.Name.ToLower().Equals(dt.Columns[j].ColumnName.ToLower()))
                        {
                            //匹配成功后先判断它是否为空
                            if (dt.Rows[i][j] != DBNull.Value)
                            {
                                if (dt.Rows[i][j].GetType().ToString() != "MySql.Data.Types.MySqlDateTime")
                                {
                                    //给对象的属性赋值
                                    item.SetValue(t, dt.Rows[i][j], null);
                                }
                                else
                                {
                                    //给对象的属性赋值
                                    item.SetValue(t, Convert.ToDateTime(dt.Rows[i][j]), null);
                                }
                            }
                            else
                            {
                                //给对象的属性赋值
                                object obj;
                                switch (item.PropertyType.ToString())
                                {
                                    #region
                                    case "System.Nullable`1[System.String]":
                                        obj = "";
                                        break;
                                    case "System.String":
                                        obj = "";
                                        break;
                                    case "System.Nullable`1[System.Boolean]":
                                        obj = false;
                                        break;
                                    case "System.Boolean":
                                        obj = false;
                                        break;
                                    case "System.Nullable`1[System.Int32]":
                                        obj = 0;
                                        break;
                                    case "System.Int32":
                                        obj = 0;
                                        break;
                                    case "System.Nullable`1[System.DateTime]":
                                        obj = DateTime.Now;
                                        break;
                                    case "System.DateTime":
                                        obj = DateTime.Now;
                                        break;
                                    case "System.Nullable`1[System.Double]":
                                        obj = 0;
                                        break;
                                    case "System.Double":
                                        obj = 0;
                                        break;
                                    case "System.Nullable`1[System.Decimal]":
                                        obj = 0;
                                        break;
                                    case "System.Decimal":
                                        obj = 0;
                                        break;
                                    case "MySql.Data.Types.MySqlDateTime":
                                        obj = DateTime.Now;
                                        break;
                                    default: obj = null;
                                        break;
                                    #endregion
                                }
                                item.SetValue(t, obj, null);
                            }
                            break;
                        }
                        #endregion
                    }
                }
                //将实体对象添加到泛型集合中
                list.Add(t);
            }
            return list;

        }

    }
}
